home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / Apps / Graphics / Others / BitmapTest / MovingBitmap.m < prev    next >
Text File  |  1992-12-25  |  5KB  |  128 lines

  1. /***************************************************************************/
  2. /* MovingBitmap.m - interface file for MovingBitmap class                  */
  3. /* January 1990 Carl F. Sutter                               */
  4. /***************************************************************************/
  5.  
  6. #import "MovingBitmap.h"
  7. #import <dpsclient/dpsclient.h>    // for NX_COPY or other compositing op
  8. #import <dpsclient/psops.h>        // for PSsetgray
  9. #import <dpsclient/wraps.h>        // for PScompositerect
  10. #import <appkit/nextstd.h>        // for MIN and MAX
  11. #import <time.h>                // for time
  12. #import <stdlib.h>            // for rand and srand
  13.  
  14. @implementation MovingBitmap
  15.  
  16. /***************************************************************************/
  17. /* initFromMachO:inFrame: - make a new bitmap from the given name            */
  18. /***************************************************************************/
  19. - initFromMachO:(const char *)tiffFile inFrame:(NXRect *)limits;
  20.    {
  21.    [super init];
  22.    bmpPiece = [NXImage findImageNamed:tiffFile];
  23.    [bmpPiece getSize:&nxsPiece];
  24.    srand( time( 0 ) );  /* randomize the random number generator */
  25.    flXVel = (float)((rand() % 11) - 5);
  26.    flYVel = (float)((rand() % 11) - 5);
  27.    flXPos = flOldXPos = limits->size.width / 2.0;
  28.    flYPos = flOldYPos = limits->size.height / 2.0;
  29.    [self setFrame:limits];
  30.    return( self );
  31.    } /* newFromMachO:inFrame: 1/25/90 CFS */
  32.  
  33.  
  34. /***************************************************************************/
  35. /* setFrame: - set the new bounds for the bitmap's world               */
  36. /***************************************************************************/
  37. - setFrame:(NXRect *)nxrFrame
  38.    {
  39.    nxrLimits = *nxrFrame;
  40.    nxrLimits.size.width -= nxsPiece.width;
  41.    nxrLimits.size.height -= nxsPiece.height;
  42.    /* if the bitmap is out of the view, move it to the nearest edge */
  43.    flXPos = MIN( NX_MAXX( &nxrLimits ), MAX( NX_X( &nxrLimits ), flXPos ) );
  44.    flYPos = MIN( NX_MAXY( &nxrLimits ), MAX( NX_Y( &nxrLimits ), flYPos ) );
  45.    return( self );
  46.    } /* setFrame: 1/25/90 CFS */
  47.    
  48.  
  49. /***************************************************************************/
  50. /* setPosition:: - set the current position of the bitmap               */
  51. /***************************************************************************/
  52. - setPosition:(float)xPos :(float)yPos
  53.    {
  54.    flXPos = xPos;
  55.    flYPos = yPos;
  56.    return( self );
  57.    } /* setPosition:: 1/25/90 CFS */
  58.    
  59.  
  60. /***************************************************************************/
  61. /* setVelocity:: - set the current velocity of the bitmap               */
  62. /***************************************************************************/
  63. - setVelocity:(float)xVel :(float)yVel
  64.    {
  65.    flXVel = xVel;
  66.    flYVel = yVel;
  67.    return( self );
  68.    } /* setVelocity:: 1/25/90 CFS */
  69.  
  70.  
  71. /***************************************************************************/
  72. /* move - move the bitmap by one velocity step, bounce off of walls if hit */
  73. /***************************************************************************/
  74. - move
  75.    {
  76.    /* save current position for erasing */
  77.    flOldXPos = flXPos;
  78.    flOldYPos = flYPos;
  79.    /* move one velocity step */
  80.    flXPos += flXVel;
  81.    flYPos += flYVel;
  82.    /* bounce off of a vertical wall if there is a collision */
  83.    if ((flXPos < NX_X( &nxrLimits )) || (flXPos > NX_MAXX( &nxrLimits )))
  84.       {
  85.       flXPos -= flXVel;
  86.       flXVel = -flXVel;
  87.       }
  88.    /* bounce off of a horizontal wall if there is a collision */
  89.    if ((flYPos < NX_Y( &nxrLimits )) || (flYPos > NX_MAXY( &nxrLimits )))
  90.       {
  91.       flYPos -= flYVel;
  92.       flYVel = -flYVel;
  93.       }
  94.    return( self );
  95.    } /* move 1/25/90 CFS */
  96.    
  97.  
  98. /***************************************************************************/
  99. /* erase - erase the areas under the old bitmap positions                  */
  100. /* PScompositerect just fills a rectangle with the current color & alpha   */
  101. /***************************************************************************/
  102. - erase
  103.    {
  104.    NXRect   nxrFill = { flOldXPos, flOldYPos, nxsPiece.width, nxsPiece.height };
  105.    
  106.    PSsetgray( NX_LTGRAY );
  107.    PSsetalpha( 1 ); /* opaque */
  108.    PScompositerect( flOldXPos, flOldYPos, nxsPiece.width, nxsPiece.height, NX_SOVER );
  109.    return( self );
  110.    } /* erase 1/25/90 CFS */
  111.    
  112.  
  113. /***************************************************************************/
  114. /* draw - composite the bitmap to the screen                          */
  115. /***************************************************************************/
  116. - draw
  117.    {
  118.    /* use floor to make the bitmap draw on a unit edge, otherwise it might */
  119.    /* spill over by one pixel */
  120.    NXPoint    nxpPosition = { floor(flXPos), floor(flYPos) };
  121.    
  122.    [bmpPiece composite:NX_SOVER toPoint:&nxpPosition];
  123.    return( self );
  124.    } /* draw 1/25/90 CFS */
  125.  
  126.  
  127. @end
  128.